package trasisgestion.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import trasisgestion.excepcion.DAOExcepcion;
import trasisgestion.excepcion.LoginExcepcion;
import trasisgestion.modelo.Usuario;
import trasisgestion.util.ConexionBD;

public class UsuarioDAO extends BaseDAO {

	public Usuario obtenerPorIdUsuario(int idUsuario) throws DAOExcepcion {
		System.out.println("UsuarioDAO: obtener(Int idUsuario)");
		String query = "select idUsuario, No_Nombres, No_ApePaterno, No_ApeMaterno, Fl_Sexo, Fl_TipoDocu, Nu_NroDocu, Tx_Correo, Nu_Celular, Tx_Clave, idTipo_Usuario, Centro_Formacion_IdCentroFormacion"
		+ " from usuario where idUsuario=?";
		Usuario vo = new Usuario();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setIdUsuario(rs.getInt("idUsuario"));
				vo.setNo_Nombres(rs.getString("No_Nombres"));
				vo.setNo_ApePaterno(rs.getString("No_ApePaterno"));
				vo.setNo_ApeMaterno(rs.getString("No_ApeMaterno"));
				vo.setFl_Sexo(rs.getString("Fl_Sexo"));
				vo.setFl_TipoDocu(rs.getString("Fl_TipoDocu"));
				vo.setNu_NroDocu(rs.getString("Nu_NroDocu"));				
				vo.setTx_Correo(rs.getString("Tx_Correo"));
				vo.setNu_Celular(rs.getString("Nu_Celular"));
				vo.setTx_Clave(rs.getString("Tx_Clave"));
				vo.setIdTipo_Usuario(rs.getInt("idTipo_Usuario"));				
				vo.setCentro_Formacion_IdCentroFormacion(rs.getInt("Centro_Formacion_IdCentroFormacion"));
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Usuario> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select idUsuario, No_Nombres, No_ApePaterno, No_ApeMaterno, Fl_Sexo, Fl_TipoDocu, Nu_NroDocu, Tx_Correo, Nu_Celular, Tx_Clave, idTipo_Usuario, Centro_Formacion_IdCentroFormacion "
				+ " from usuario where No_Nombres like ?";
		Collection<Usuario> c = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setIdUsuario(rs.getInt("idUsuario"));
				vo.setNo_Nombres(rs.getString("No_Nombres"));
				vo.setNo_ApePaterno(rs.getString("No_ApePaterno"));
				vo.setNo_ApeMaterno(rs.getString("No_ApeMaterno"));
				vo.setFl_Sexo(rs.getString("Fl_Sexo"));
				vo.setFl_TipoDocu(rs.getString("Fl_TipoDocu"));
				vo.setNu_NroDocu(rs.getString("Nu_NroDocu"));				
				vo.setTx_Correo(rs.getString("Tx_Correo"));
				vo.setNu_Celular(rs.getString("Nu_Celular"));
				vo.setTx_Clave(rs.getString("Tx_Clave"));
				vo.setIdTipo_Usuario(rs.getInt("idTipo_Usuario"));				
				vo.setCentro_Formacion_IdCentroFormacion(rs.getInt("Centro_Formacion_IdCentroFormacion"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Usuario insertar(Usuario vo) throws DAOExcepcion {
		
		String query = "INSERT INTO usuario (idUsuario, No_Nombres, No_ApePaterno, No_ApeMaterno, Fl_Sexo, Fl_TipoDocu, Nu_NroDocu, Tx_Correo, Nu_Celular, Tx_Clave, idTipo_Usuario, Centro_Formacion_IdCentroFormacion)"
				+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?) ";
		System.out.println("UsuarioDAO: Insertar(Usuario vo)");
		System.err.println(query);
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdUsuario());
			stmt.setString(2, vo.getNo_Nombres());
			stmt.setString(3, vo.getNo_ApePaterno());
			stmt.setString(4, vo.getNo_ApeMaterno());
			stmt.setString(5, vo.getFl_Sexo());
			stmt.setString(6, vo.getFl_TipoDocu());
			stmt.setString(7, vo.getNu_NroDocu());
			stmt.setString(8, vo.getTx_Correo());
			stmt.setString(9, vo.getNu_Celular());
			stmt.setString(10, vo.getTx_Clave());
			stmt.setInt(11, vo.getIdTipo_Usuario());
			stmt.setInt(12, vo.getCentro_Formacion_IdCentroFormacion());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Usuario actualizar(Usuario vo) throws DAOExcepcion {
		System.out.println("UsuarioDAO: actualizar(Usuario vo)");
		String query = "UPDATE usuario SET No_Nombres=?, No_ApePaterno=?, No_ApeMaterno=?, Fl_Sexo=?, Fl_TipoDocu=?, Nu_NroDocu=?, Tx_Correo=?, Nu_Celular=?, Tx_Clave=?,"
				+ " idTipo_Usuario=?, Centro_Formacion_IdCentroFormacion=? WHERE idUsuario=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);			
			stmt.setString(1, vo.getNo_Nombres());
			stmt.setString(2, vo.getNo_ApePaterno());
			stmt.setString(3, vo.getNo_ApeMaterno());
			stmt.setString(4, vo.getFl_Sexo());
			stmt.setString(5, vo.getFl_TipoDocu());
			stmt.setString(6, vo.getNu_NroDocu());
			stmt.setString(7, vo.getTx_Correo());
			stmt.setString(8, vo.getNu_Celular());
			stmt.setString(9, vo.getTx_Clave());
			stmt.setInt(10, vo.getIdTipo_Usuario());
			stmt.setInt(11, vo.getCentro_Formacion_IdCentroFormacion());
			stmt.setInt(12, vo.getIdUsuario());

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(int idUsuario) throws DAOExcepcion {
		System.out.println("UsuarioDAO: Eliminar(String UsuarioNombre)");
		String query = "DELETE FROM usuario WHERE idUsuario=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Usuario> listarTodos() throws DAOExcepcion {
		String query = "select idUsuario, No_Nombres, No_ApePaterno, No_ApeMaterno, Fl_Sexo, Fl_TipoDocu, Nu_NroDocu, Tx_Correo, Nu_Celular, Tx_Clave, idTipo_Usuario, Centro_Formacion_IdCentroFormacion"
				+ " from usuario";
		Collection<Usuario> c = new ArrayList<Usuario>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Usuario vo = new Usuario();
				vo.setIdUsuario(rs.getInt("idUsuario"));
				vo.setNo_Nombres(rs.getString("No_Nombres"));
				vo.setNo_ApePaterno(rs.getString("No_ApePaterno"));
				vo.setNo_ApeMaterno(rs.getString("No_ApeMaterno"));
				vo.setFl_Sexo(rs.getString("Fl_Sexo"));
				vo.setFl_TipoDocu(rs.getString("Fl_TipoDocu"));
				vo.setNu_NroDocu(rs.getString("Nu_NroDocu"));				
				vo.setTx_Correo(rs.getString("Tx_Correo"));
				vo.setNu_Celular(rs.getString("Nu_Celular"));
				vo.setTx_Clave(rs.getString("Tx_Clave"));
				vo.setIdTipo_Usuario(rs.getInt("idTipo_Usuario"));				
				vo.setCentro_Formacion_IdCentroFormacion(rs.getInt("Centro_Formacion_IdCentroFormacion"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public Usuario validar(int idUsuario, String clave)
			throws DAOExcepcion, LoginExcepcion {
		String query = "select idUsuario, No_Nombres, No_ApePaterno, No_ApeMaterno, Fl_Sexo, Fl_TipoDocu,"
				+ "Nu_NroDocu, Tx_Correo, Nu_Celular, Tx_Clave, idTipo_Usuario,"
				+ "Centro_Formacion_IdCentroFormacion from usuario where idUsuario=? and Tx_Clave=?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Usuario vo = new Usuario();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idUsuario);
			stmt.setString(2, clave);
			rs = stmt.executeQuery();

			if (rs.next()) {
				vo.setIdUsuario(rs.getInt("idUsuario"));
				vo.setNo_Nombres(rs.getString("No_Nombres"));
				vo.setNo_ApePaterno(rs.getString("No_ApePaterno"));
				vo.setNo_ApeMaterno(rs.getString("No_ApeMaterno"));
				vo.setFl_Sexo(rs.getString("Fl_Sexo"));
				vo.setFl_TipoDocu(rs.getString("Fl_TipoDocu"));
				vo.setNu_NroDocu(rs.getString("Nu_NroDocu"));				
				vo.setTx_Correo(rs.getString("Tx_Correo"));
				vo.setNu_Celular(rs.getString("Nu_Celular"));
				vo.setTx_Clave(rs.getString("Tx_Clave"));
				vo.setIdTipo_Usuario(rs.getInt("idTipo_Usuario"));				
				vo.setCentro_Formacion_IdCentroFormacion(rs.getInt("Centro_Formacion_IdCentroFormacion"));
			} else {
				throw new LoginExcepcion("No existe");
			}
		} catch (LoginExcepcion e) {
			System.err.println(e.getMessage());
			throw new LoginExcepcion(e.getMessage());
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

}
